package filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/*
* Filter的快速入门

     Filter : 过滤器
       1: 概念
         * web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来完成一些特殊的功能
         * 过滤器的作用:
            * 一般用于完成一些通用的操作. 如: 登录操作,统一编码处理,敏感字符过滤..

       2: 快速入门:
         1:步骤 :
            1: 定义一个类,实现接口filter(Filter要注意选择servlet包下的)
            2: 重写方法
            3: 配置拦截路径(两种配置方法)
              1: web.xml
              2: 注解配置(也就是在类名上加上WebFilter然后写上拦截拦截路径,和servlet的注解配置一个道理)

      3: 过滤器的细节:
         1: web.xml配置(在web.xml中)
            <filter>
       <filter-name>demo01</filter-name>
        <filter-class>filter.FilterDemo01</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>demo01</filter-name>
        <url-pattern>/*</url-pattern>  <!--"/*"表示了访问所有资源当需要经过过滤器-->
    </filter-mapping>
         2: 过滤器的执行流程
           在FilterDemo02中演示了
         3: 过滤器生命周期方法
              1: init:在服务器启动后,会创建Filter对象然后调用init方法.该方法只会执行一次
              2: destroy:该方法会在每一次拦截请求的时候都会执行一次,会执行多次
              3: doFilter: 该方法会在每一次拦截请求的时候都会执行一次,会执行多次
         4: 过滤器配置详解
             * 拦截路径配置:
                1: 具体资源路径: /index.jsp  只有访问index.jsp资源时,过滤器才会被执行
                2: 拦截目录: /user/*   访问/user下的所有资源时,过滤器才会被执行
                3: 后缀名拦截: *.jsp   访问所有后缀名为jsp资源时,过滤器才会被执行
                4: 拦截所有资源: /*    访问所有资源时,过滤器都会执行
             * 拦截方式配置:资源被访问的方式
                * 注解配置:
                  * 设置dispatcherTypes属性
                     1: REQUEST: 默认值.浏览器直接请求资源
                     2: FORWARD: 转发访问资源(设置该属性值之后只有转发访问的资源才会被拦截)
                     3: INCLUDE: 了解即可
                     4: ERROR:   了解即可
                     5: ASYNC:   了解即可
               * web.xml配置
                 * 设置<dispatcher></dispatcher>标签即可
       5: 过滤器链(配置多个过滤器)
          * 执行顺序: 如果有两个过滤器1和过滤器2
             1: 过滤器1
             2: 过滤器2
             3: 资源执行
             4: 过滤器2
             5: 过滤器1
          * 过滤器先后顺序问题:
             1: 注解配置:按照类名的字符串比较规则比较,值小的先执行 (一次性只会比较一个值)
                * 如: AFilter和BFilter,这两个中AFilter会先执行
                * 如: demo16和demo7这两两个资源文件会是demo16先执行,一次性比较一个值
             2:web.xml配置
                * 在web.xml配置多个filter时谁的<filter-mapping>定义在上边谁就先执行.

 */

//@WebFilter("/*") //表示在访问所有的资源之前,都会执行该过滤器
public class FilterDemo01 implements Filter {
    @Override
    /*
     在服务器启动后,会创建Filter对象然后调用init方法
     该方法只会执行一次
    */
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    //该方法会在每一次拦截请求的时候都会执行一次,会执行多次
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("FilterDemo已经执行了....");

        //写过滤器必须执行的一个操作--方形
        filterChain.doFilter(servletRequest,servletResponse);
    }

    @Override
    /*
    在服务器关闭后,Filter对象会被销毁.如果服务器是正常关闭的则会调用destroy方法.只会执行一次

    */
    public void destroy() {

    }
}
